#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100

char arruma(char letra);
int palindromo(char string[]);
void crivo(char palindromo[]);
int compare (const void * a, const void * b);

int main(){
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "teste" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */
  int i = 0, j = 0, k = 0;
  char palavra[100];

  while(i < strlen(buffer))
  {
    while(isalpha(buffer[i]))
    {
    palavra[j] = buffer[i]; j++; i++;
    }
    palavra[j] = '\0';
    j = 0;
   // printf("%s\n",palavra);
    if(palindromo(palavra) == 0 && strlen(palavra) > 1)
        crivo(palavra);
    //    printf("a palavra %s é palíndromo\n",palavra);

    i++;
  }

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

int palindromo(char string[]){

  char strcomespaco[MAX],str1[MAX], str2[MAX];
  int tamcomespaco,tam, i, j;

  strcpy(strcomespaco,string);

  tamcomespaco = strlen(strcomespaco);

  for(i=0,j=0;i<tamcomespaco;i++)
 {
     strcomespaco[i] = arruma(strcomespaco[i]);
    if(isalpha(strcomespaco[i]))
    {
        str1[j] = strcomespaco[i];
        j++;
    }
 }

str1[j]='\0';

tam = strlen(str1);

for (i=tam-1,j=0;i>=0;i--,j++)
str2[j] = str1[i];

str2[tam] = '\0';

if (strcmp(str1,str2) == 0)
return 0;
else
return 1;
}

char arruma(char letra)
{
    if(letra >= 65 && letra <= 90)
        letra = letra + 32;

    return letra;
}

int compare (const void * a, const void * b) {
  return ( *(int*)a - *(int*)b );
}

void crivo(char palindromo[]) {
	 int i, j, k, l;
     int *intervalo;
     int tam = strlen(palindromo), maior = 0, limite, div = 0;

  	 intervalo = (int*) malloc (tam);

  	 for(i = 0; i < tam; i++) {
	 	   intervalo[i] = palindromo[i];

		   if(maior < intervalo[i])
		   			maior = intervalo[i];
     }
     printf("\n----------------------ORIGINAL-----------------------\n");
     for(l = 0; l < tam; l++) {
        printf("\n%d = %d\n", l, intervalo[l]);
     }

     limite = sqrt(maior);

     qsort(intervalo, tam, sizeof(int), compare);

     for(i = 0; i < tam; i++) {
	 	   if(intervalo[i] > 1) {
		      for (j = 1; j <= intervalo[i]; j++) {
                    if (intervalo[i] % j == 0) {
                        div++;
                    }
              }
	       }

           if(div == 2) { //é primo
              for(k = i+1; k < tam; k++) {
                    if(intervalo[k] % intervalo[i] == 0) {
                        //remover da lista
                        intervalo[k] = -1;
                    }
              }
           }
           else {
              intervalo[i] = -1;
           }
           div = 0;

           if(intervalo[i] == limite) {
              break;
           }
     }

     printf("------------------------PRIMOS-------------------------");
     for(l = 0; l < tam; l++) {
        printf("\n%d = %d\n", l, intervalo[l]);
     }
}
